//package com.com.typhoon.dao;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.jdbc.core.BeanPropertyRowMapper;
//import org.springframework.jdbc.core.JdbcOperations;
//import org.springframework.jdbc.core.PreparedStatementCreator;
//import org.springframework.jdbc.support.GeneratedKeyHolder;
//import org.springframework.jdbc.support.KeyHolder;
//
//import java.lang.reflect.Field;
//import java.sql.Connection;
//import java.sql.PreparedStatement;
//import java.sql.SQLException;
//import java.sql.Statement;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @author shuya | dongfeng.zdf@alibaba-inc.com
// * @description
// * @date 2018/10/17 下午2:33
// * @description
// * @modified by
// * @since V2.0.0
// */
//@Slf4j
//public class BaseDao {
//    protected static final String select = "select ";
//    protected static final String from = " from ";
//    protected static final String where = " where ";
//    protected static final String and = " and ";
//    protected static final String orderBy = " order by ";
//    protected static final String oneEqOne = " 1=1 ";
//    protected static final String count = " count ";
//    protected static final String sum = " sum ";
//    protected static final String allSymbol = "(*) ";
//    protected static final String seqId = "seqId";
//    protected static final String star = " * ";
//    protected JdbcOperations jdbcTemplate;
//
//    protected JdbcOperations getJdbcTemplate() {
//        return jdbcTemplate;
//    }
//
//    public void setJdbcTemplate(JdbcOperations jdbcTemplate) {
//        this.jdbcTemplate = jdbcTemplate;
//    }
//
//    protected <T> T queryByPrimaryKey(String tableName, String primaryKey, Object value, Class<T> clazz) {
//        StringBuilder sqlBuilder = new StringBuilder();
//        sqlBuilder.append(select);
//        sqlBuilder.append(star);
//        sqlBuilder.append(from);
//        sqlBuilder.append(tableName);
//        if (null == primaryKey || 0 >= primaryKey.length()) {
//            primaryKey = "id";
//        }
//        sqlBuilder.append(where);
//        sqlBuilder.append(primaryKey);
//        sqlBuilder.append("  = ? limit 1 ");
//        log.debug("querySql-{}", sqlBuilder.toString());
//        List<T> list = this.jdbcTemplate.query(sqlBuilder.toString(), BeanPropertyRowMapper.newInstance(clazz), value);
//        if (null == list || list.isEmpty()) {
//            return null;
//        }
//        return list.get(0);
//    }
//
//    protected <T> T queryByPrimaryKey(String tableName, Object value, Class<T> clazz) {
//        return this.queryByPrimaryKey(tableName, null, value, clazz);
//    }
//
//    protected <T> T addObjForKey(final JdbcOperations jdbcTemplate, String tableName, T obj, String primaryKey) {
//        StringBuilder sbField = new StringBuilder();
//        StringBuilder sbArgs = new StringBuilder();
//        List<Object> args = new ArrayList<>();
//
//        sbField.append(" ( ");
//        sbArgs.append(" ( ");
//        Field[] fields = obj.getClass().getDeclaredFields();
//        if ((fields != null) && (fields.length > 0)) {
//            String name = "";
//            Object value = null;
//            for (int i = 0; i < fields.length; i++) {
//                name = fields[i].getName();
//                if (!name.toLowerCase().equals("serialversionuid")) {
//                    value = RegUtil.getProperty(obj, name);
//                    if (value != null) {
//                        if (!"seqId".equals(name)) {
//                            sbField.append(name);
//                            if (i < fields.length - 1)
//                                sbField.append(", ");
//
//                            sbArgs.append("? ");
//                            if (i < fields.length - 1)
//                                sbArgs.append(", ");
//                            args.add(value);
//                        }
//                    }
//                }
//            }
//        }
//        if (sbField.toString().trim().endsWith(",")) {
//            sbField = new StringBuilder(sbField.substring(0, sbField.lastIndexOf(",")));
//        }
//        if (sbArgs.toString().trim().endsWith(",")) {
//            sbArgs = new StringBuilder(sbArgs.substring(0, sbArgs.lastIndexOf(",")));
//        }
//        sbField.append(" ) ");
//        sbArgs.append(" ) ");
//        StringBuilder sql = new StringBuilder();
//        sql.append("insert into ").append(tableName).append(" ");
//        sql.append(sbField).append(" values ").append(sbArgs);
//
//        final String finalsql = sql.toString();
//        final List<Object> list = args;
//
//        KeyHolder keyHolder = new GeneratedKeyHolder();
//
//        jdbcTemplate.update(new PreparedStatementCreator() {
//            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
//                PreparedStatement pst = con.prepareStatement(finalsql, Statement.RETURN_GENERATED_KEYS);
//                if (null != list && !list.isEmpty()) {
//                    for (int i = 0; i < list.size(); i++) {
//                        pst.setObject(i + 1, list.get(i));
//                    }
//                }
//                return pst;
//            }
//        }, keyHolder);
//        if (StringUtils.isBlank(primaryKey)) {
//            primaryKey = "seqId";
//        }
//        RegUtil.setProperty(obj, primaryKey, keyHolder.getKey().longValue());
//        return obj;
//    }
//
//}
